/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package semac.control;

import java.io.IOException;
import java.util.ArrayList;
import java.sql.*;
import java.util.GregorianCalendar;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import semac.entidades.Cuenta;

/**
 *
 * @author Luigi
 */
public class CtrlCuentas {
    private ArrayList<Cuenta> listaCuentas;
    private CtrlRoles manejadorRoles;
    private CtrlPersonas manejadorPersonas;
    private Conexion connection;
    private ResultSet resultado;
    private String query;
    private HttpServletRequest request;

    public CtrlCuentas() throws IOException, ParserConfigurationException, SAXException{
        request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
        String urlFile =  request.getRealPath("/")+ "/WEB-INF/dataBase.xml";
        connection =  new Conexion(urlFile);
    }

    //Realizar la busqueda del codigo una persona por medio del nombre de usuario
    /*Necesito un proceso almacenado para la tabla cuenta
     SELECT codigo_Persona
     FROM CUENTA
     WHERE usuario_Cuenta = usuario*/
    public int getCodigoPersona(String usuario) throws ClassNotFoundException, SQLException{
        connection.startConnection();
        query = "select * "
                + "from semac.cuenta "
                + "where usuario_cuenta = '" +  usuario + "'";
        resultado = connection.execute(query);
        resultado.next();
        int codigoPersona = resultado.getInt("codigo_Persona");
        connection.closeConnection();
        return codigoPersona;
    }

    public void testConnection() throws ClassNotFoundException, SQLException{
        connection.startConnection();
        connection.closeConnection();
    }

    //Metodo que busca los datos de la cuenta en base al usuario
    /*Necesito un proceso almacenado para la tabla cuenta
     SELECT *
     FROM CUENTA
     WHERE usuario_Cuenta = usuario*/
    public Cuenta getCuenta(String usuario) throws ClassNotFoundException, SQLException, Exception{
        Cuenta cuenta;
        connection.startConnection();
        query = "select * "
                + "from semac.cuenta "
                + "where usuario_cuenta = '" +  usuario + "'";
        resultado = connection.execute(query);
        resultado.next();
        int codigoCuenta = resultado.getInt("codigo_cuenta");
        String usuarioCuenta = resultado.getString("usuario_cuenta");
        String contrasenia = resultado.getString("contrasenia_cuenta");
        int codigoPersona = resultado.getInt("codigo_persona");
        int codigoRol = resultado.getInt("codigo_rol");
        int codigoEstadoActividad = resultado.getInt("codigo_estadoactividad");
        Date tempDate = resultado.getDate("fechacreacion");
        GregorianCalendar fechaCreacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        tempDate = resultado.getDate("fechamodificacion");
        GregorianCalendar fechaModificacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        int ultimoAcceso = resultado.getInt("codigocuenta");
        cuenta = new Cuenta(codigoCuenta, codigoPersona, codigoRol, usuarioCuenta, contrasenia, codigoEstadoActividad,
        fechaCreacion, fechaModificacion, ultimoAcceso);
        connection.closeConnection();
        return cuenta;
    }

    //Metodo que busca los datos de la cuennta en base al codigo de la persona
      /*Necesito un proceso almacenado para la tabla cuenta
     SELECT *
     FROM CUENTA
     WHERE codigo_Persona = codigoPersona*/
    public Cuenta getCuenta(int codigoPer)throws ClassNotFoundException,SQLException{
        Cuenta cuenta;
        connection.startConnection();
        query = "select * "
                + "from semac.cuenta "
                + "where codigo_persona = " +  codigoPer;
        resultado = connection.execute(query);
        resultado.next();
        int codigoCuenta = resultado.getInt("codigo_cuenta");
        String usuarioCuenta = resultado.getString("usuario_cuenta");
        String contrasenia = resultado.getString("usuario_cuenta");
        int codigoPersona = resultado.getInt("codigo_persona");
        int codigoRol = resultado.getInt("codigo_rol");
        int codigoEstadoActividad = resultado.getInt("codigo_estadoactividad");
        Date tempDate = resultado.getDate("fechacreacion");
        GregorianCalendar fechaCreacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        tempDate = resultado.getDate("fechamodificacion");
        GregorianCalendar fechaModificacion = new GregorianCalendar(tempDate.getYear(), tempDate.getMonth(), tempDate.getDate());
        int ultimoAcceso = resultado.getInt("codigocuenta");
        cuenta = new Cuenta(codigoCuenta, codigoPersona, codigoRol, usuarioCuenta, contrasenia, codigoEstadoActividad,
        fechaCreacion, fechaModificacion, ultimoAcceso);
        connection.closeConnection();
        return cuenta;
    }

    //Metodo que modifica el estado de actividad de una cuenta
    public void updateEstadoActividad(String usuario, int codigoEstadoActividad)throws ClassNotFoundException,SQLException{
        connection.startConnection();
        query = "update semac.cuenta "
                + "set codigo_estadoactividad = " + codigoEstadoActividad
                + " where usuario_cuenta = '" + usuario + "'";
        connection.execute(query);
        connection.closeConnection();
    }

    //Agrega una cuenta a la base de datos
    public void insertCuenta(Cuenta nuevaCuenta)throws ClassNotFoundException,SQLException{
        connection.startConnection();
        query = "insert into semac.cuenta (usuario_cuenta,contrasenia_cuenta " +
                "codigo_estadoactividad,codigo_persona,codigo_rol "
                + "fechacreacion,fechamodificacion,codigocuenta) "
                + "values('" + nuevaCuenta.getUsuario() + "','" + nuevaCuenta.getContrasenia()
                + "'," + nuevaCuenta.getCodigoEstadoActividad() + "," + nuevaCuenta.getCodigoPersona()
                + "," + nuevaCuenta.getCodigoRol() + ",'" + nuevaCuenta.getFechaCreacion().getTime().getDate()
                + "/" + (nuevaCuenta.getFechaCreacion().getTime().getMonth() + 1) + "/" + (nuevaCuenta.getFechaCreacion().getTime().getYear() + 1900)
                + "','" + nuevaCuenta.getFechaModificacion().getTime().getDate()
                + "/" + nuevaCuenta.getFechaModificacion().getTime().getDate()
                + "/" + (nuevaCuenta.getFechaModificacion().getTime().getMonth() + 1) + "/" + (nuevaCuenta.getFechaModificacion().getTime().getYear() + 1900) + "'," + nuevaCuenta.getUltimoAcceso() + ")";
        try{
            connection.execute(query);
        }catch(Exception e){}
        connection.closeConnection();
    }

    //Metodo que elimina una cuenta de la base de datos
    public void deleteCuenta(int codigoCuenta){

    }

    //Metodo que verifica si una cuenta existe en la base de datos al momento de iniciar sesion
    public boolean verificarCuenta(String usuario, String contrasenia)throws ClassNotFoundException, SQLException, Exception{
        connection.startConnection();
        query = "select * "
                + "from semac.cuenta where usuario_cuenta='" + usuario + "'";
        resultado = connection.execute(query);
        resultado.next();
        String usuarioCuenta = resultado.getString("usuario_cuenta");
        String contraseniaCuenta = resultado.getString("contrasenia_cuenta");
        connection.closeConnection();
        if (usuario==null)
            return false;
        if (usuario.equals(usuarioCuenta)&& contrasenia.equals(contraseniaCuenta))
            return true;
        return false;
    }

    public int getCodigoRol(String usuario)throws ClassNotFoundException,SQLException{
        connection.startConnection();
        query = "select * "
                + "from semac.cuenta "
                + "where usuario_cuenta = '" + usuario + "'";
        resultado = connection.execute(query);
        resultado.next();
        int numeroRol = resultado.getInt("numero_Rol");
        connection.closeConnection();
        return numeroRol;
    }

    //Metodo que comprueba si la cuenta ya fue creada y asignada a una persona
    public boolean existeCuenta(String usuario) throws ClassNotFoundException,SQLException{
        connection.startConnection();
        query = "select * "
                + "from semac.cuenta "
                + "where usuario_cuenta = '" + usuario + "'";
        resultado = connection.execute(query);
        resultado.next();
        String usuarioCuenta = resultado.getString("usuario_Cuenta");
        connection.closeConnection();
        if (usuario.equals(usuarioCuenta))
            return true;
        return false;
    }

    //Metodo que cambia la contrasenia de un usuario determinado
    public void updateContrasenia(String usuario, String nuevaContrasenia)throws ClassNotFoundException,SQLException{
        connection.startConnection();
        query = "update semac.cuenta "
                + "set contrasenia_cuenta = '" + nuevaContrasenia + "' "
                + "where usuario_cuenta = " + usuario;
        connection.execute(query);
        connection.closeConnection();
    }

    //Metodo que verifica que la confirmacion de la contrasenia sea valida
    public boolean confirmarContrasenia(String nuevaContrasenia, String confirmacionContrasenia){
        if (nuevaContrasenia.equals(confirmacionContrasenia))
            return true;
        return false;
    }
    
    //Obtiene el estado de actividad en base al usuario
    public int getEstadoActividad(String usuario)throws ClassNotFoundException,SQLException{
        connection.startConnection();
        query = "select semac.cuenta.codigo_estadoactividad "
                + "from semac.cuenta "
                + "where usuario_cuenta = '" + usuario + "'";
        resultado = connection.execute(query);
        resultado.next();
        int codigoEstadoActividad = resultado.getInt("codigo_EstadoActividad");
        connection.closeConnection();
        return codigoEstadoActividad;
    }

}